home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / cocktail / front.lha / front / m2c / Tokens.c < prev    next >
C/C++ Source or Header  |  1992-08-18  |  8KB  |  309 lines

  1. #include "SYSTEM_.h"
  2.  
  3. #ifndef DEFINITION_Lists
  4. #include "Lists.h"
  5. #endif
  6.  
  7. #ifndef DEFINITION_Strings
  8. #include "Strings.h"
  9. #endif
  10.  
  11. #ifndef DEFINITION_StringMem
  12. #include "StringMem.h"
  13. #endif
  14.  
  15. #ifndef DEFINITION_TokenTab
  16. #include "TokenTab.h"
  17. #endif
  18.  
  19. #ifndef DEFINITION_Memory
  20. #include "Memory.h"
  21. #endif
  22.  
  23. #ifndef DEFINITION_Idents
  24. #include "Idents.h"
  25. #endif
  26.  
  27. #ifndef DEFINITION_TokenTab
  28. #include "TokenTab.h"
  29. #endif
  30.  
  31. #ifndef DEFINITION_Errors
  32. #include "Errors.h"
  33. #endif
  34.  
  35. #ifndef DEFINITION_Positions
  36. #include "Positions.h"
  37. #endif
  38.  
  39. #ifndef DEFINITION_Tokens
  40. #include "Tokens.h"
  41. #endif
  42.  
  43.  
  44. #define eTokenDeclTwice    30
  45. #define eCodeExists    31
  46. typedef struct S_1 *Declarations;
  47. typedef struct S_1 {
  48.     Idents_tIdent Token;
  49.     TokenTab_PosType TokenPos;
  50.     BOOLEAN HasCoding;
  51.     union {
  52.         struct {
  53.             TokenTab_PosType EQUALPos;
  54.             TokenTab_PosType NumberPos;
  55.         } V_1;
  56.     } U_1;
  57.     Lists_tList Comment;
  58.     TokenTab_PosType CommPos;
  59.     Declarations Next;
  60. } Declaration;
  61. static struct S_2 {
  62.     Lists_tList GlobalComment;
  63.     TokenTab_PosType GlobalCommPos;
  64.     TokenTab_PosType TOKENPos;
  65.     Lists_tList TOKENComment;
  66.     TokenTab_PosType TOKENCommPos;
  67. } TokensVars;
  68. static Declarations StartDecl;
  69. static Declarations RDecl;
  70. static Declarations WDecl;
  71. static BOOLEAN ReadyForReading;
  72. static void ERROR ARGS((CHAR a[], LONGCARD ));
  73.  
  74.  
  75. void Tokens_MakeGlobalHeader
  76. # ifdef __STDC__
  77. (Lists_tList GlobalComment, TokenTab_PosType GlobalCommPos)
  78. # else
  79. (GlobalComment, GlobalCommPos)
  80. Lists_tList GlobalComment;
  81. TokenTab_PosType GlobalCommPos;
  82. # endif
  83. {
  84.   TokensVars.GlobalComment = GlobalComment;
  85.   TokensVars.GlobalCommPos = GlobalCommPos;
  86. }
  87.  
  88. void Tokens_MakeTokensHeader
  89. # ifdef __STDC__
  90. (TokenTab_PosType TOKENPos, Lists_tList TOKENComment, TokenTab_PosType TOKENCommPos)
  91. # else
  92. (TOKENPos, TOKENComment, TOKENCommPos)
  93. TokenTab_PosType TOKENPos;
  94. Lists_tList TOKENComment;
  95. TokenTab_PosType TOKENCommPos;
  96. # endif
  97. {
  98.   TokensVars.TOKENPos = TOKENPos;
  99.   TokensVars.TOKENComment = TOKENComment;
  100.   TokensVars.TOKENCommPos = TOKENCommPos;
  101. }
  102.  
  103. void Tokens_MakeDeclaration
  104. # ifdef __STDC__
  105. (Idents_tIdent Token, TokenTab_PosType TokenPos, BOOLEAN HasCoding, TokenTab_PosType EQUALPos, TokenTab_Terminal Number, TokenTab_PosType NumberPos, Lists_tList Comment, TokenTab_PosType CommPos)
  106. # else
  107. (Token, TokenPos, HasCoding, EQUALPos, Number, NumberPos, Comment, CommPos)
  108. Idents_tIdent Token;
  109. TokenTab_PosType TokenPos;
  110. BOOLEAN HasCoding;
  111. TokenTab_PosType EQUALPos;
  112. TokenTab_Terminal Number;
  113. TokenTab_PosType NumberPos;
  114. Lists_tList Comment;
  115. TokenTab_PosType CommPos;
  116. # endif
  117. {
  118.   Declarations HDecl;
  119.   TokenTab_TokenError Error;
  120.  
  121.   if (ReadyForReading) {
  122.     ERROR((STRING)"MakeDeclaration: do not write", 29L);
  123.   }
  124.   HDecl = (Declarations)Memory_Alloc((LONGINT)sizeof(Declaration));
  125.   if (HDecl == NIL) {
  126.     ERROR((STRING)"MakeDeclaration: Heap overflow", 30L);
  127.   }
  128.   HDecl->Token = Token;
  129.   HDecl->TokenPos = TokenPos;
  130.   HDecl->HasCoding = HasCoding;
  131.   HDecl->Next = NIL;
  132.   if (HasCoding) {
  133.     TokenTab_MakeTerm(Token, &Number, &Error, TokenPos);
  134.     if (Error == TokenTab_SymbolExists) {
  135.       Errors_ErrorMessageI((LONGCARD)eTokenDeclTwice, (LONGCARD)Errors_eError, TokenPos, (LONGCARD)Errors_eIdent, ADR(Token));
  136.       return;
  137.     } else if (Error == TokenTab_CodeExists) {
  138.       Errors_ErrorMessageI((LONGCARD)eCodeExists, (LONGCARD)Errors_eError, TokenPos, (LONGCARD)Errors_eIdent, ADR(Token));
  139.       return;
  140.     }
  141.     HDecl->U_1.V_1.EQUALPos = EQUALPos;
  142.     HDecl->U_1.V_1.NumberPos = NumberPos;
  143.   } else {
  144.     TokenTab_MakeDefTerm(&Token, &Error, TokenPos);
  145.     if (Error == TokenTab_SymbolExists) {
  146.       Errors_ErrorMessageI((LONGCARD)eTokenDeclTwice, (LONGCARD)Errors_eError, TokenPos, (LONGCARD)Errors_eIdent, ADR(Token));
  147.       return;
  148.     }
  149.   }
  150.   HDecl->Comment = Comment;
  151.   HDecl->CommPos = CommPos;
  152.   if (WDecl == NIL) {
  153.     StartDecl = HDecl;
  154.   } else {
  155.     WDecl->Next = HDecl;
  156.   }
  157.   WDecl = HDecl;
  158. }
  159.  
  160. void Tokens_CompleteDeclarations
  161. # ifdef __STDC__
  162. ()
  163. # else
  164. ()
  165. # endif
  166. {
  167.   TokenTab_TokenError Error;
  168.  
  169.   RDecl = StartDecl;
  170.   while (RDecl != NIL) {
  171.     if (!RDecl->HasCoding) {
  172.       TokenTab_CompleteDefTerm(RDecl->Token, &Error);
  173.       if (Error == TokenTab_NotExists) {
  174.         ERROR((STRING)"CompleteDeclarations: token does not exists", 43L);
  175.       } else if (Error == TokenTab_CodeExists) {
  176.         ERROR((STRING)"CompleteDeclarations: token already complete", 44L);
  177.       } else if (Error == TokenTab_NotTerm) {
  178.         ERROR((STRING)"CompleteDeclarations: token is nonterminal", 42L);
  179.       }
  180.     }
  181.     RDecl = RDecl->Next;
  182.   }
  183.   RDecl = StartDecl;
  184.   ReadyForReading = TRUE;
  185. }
  186.  
  187. void Tokens_GetGlobalHeader
  188. # ifdef __STDC__
  189. (Lists_tList *GlobalComment, TokenTab_PosType *GlobalCommPos)
  190. # else
  191. (GlobalComment, GlobalCommPos)
  192. Lists_tList *GlobalComment;
  193. TokenTab_PosType *GlobalCommPos;
  194. # endif
  195. {
  196.   *GlobalComment = TokensVars.GlobalComment;
  197.   *GlobalCommPos = TokensVars.GlobalCommPos;
  198. }
  199.  
  200. void Tokens_GetTokensHeader
  201. # ifdef __STDC__
  202. (TokenTab_PosType *TOKENPos, Lists_tList *TOKENComment, TokenTab_PosType *TOKENCommPos)
  203. # else
  204. (TOKENPos, TOKENComment, TOKENCommPos)
  205. TokenTab_PosType *TOKENPos;
  206. Lists_tList *TOKENComment;
  207. TokenTab_PosType *TOKENCommPos;
  208. # endif
  209. {
  210.   *TOKENPos = TokensVars.TOKENPos;
  211.   *TOKENComment = TokensVars.TOKENComment;
  212.   *TOKENCommPos = TokensVars.TOKENCommPos;
  213. }
  214.  
  215. BOOLEAN Tokens_GetDeclaration
  216. # ifdef __STDC__
  217. (Idents_tIdent *Token, TokenTab_PosType *TokenPos, BOOLEAN *HasCoding, TokenTab_PosType *EQUALPos, TokenTab_PosType *NumberPos, Lists_tList *Comment, TokenTab_PosType *CommPos)
  218. # else
  219. (Token, TokenPos, HasCoding, EQUALPos, NumberPos, Comment, CommPos)
  220. Idents_tIdent *Token;
  221. TokenTab_PosType *TokenPos;
  222. BOOLEAN *HasCoding;
  223. TokenTab_PosType *EQUALPos;
  224. TokenTab_PosType *NumberPos;
  225. Lists_tList *Comment;
  226. TokenTab_PosType *CommPos;
  227. # endif
  228. {
  229.   if (!ReadyForReading) {
  230.     ERROR((STRING)"GetDeclaration: do not read", 27L);
  231.   }
  232.   if (RDecl == NIL) {
  233.     return FALSE;
  234.   } else {
  235.     *Token = RDecl->Token;
  236.     *TokenPos = RDecl->TokenPos;
  237.     *HasCoding = RDecl->HasCoding;
  238.     if (*HasCoding) {
  239.       *EQUALPos = RDecl->U_1.V_1.EQUALPos;
  240.       *NumberPos = RDecl->U_1.V_1.NumberPos;
  241.     } else {
  242.       EQUALPos->Line = 0;
  243.       EQUALPos->Column = 0;
  244.       NumberPos->Line = 0;
  245.       NumberPos->Column = 0;
  246.     }
  247.     *Comment = RDecl->Comment;
  248.     *CommPos = RDecl->CommPos;
  249.     RDecl = RDecl->Next;
  250.     return TRUE;
  251.   }
  252. }
  253.  
  254. static void ERROR
  255. # ifdef __STDC__
  256. (CHAR a[], LONGCARD O_1)
  257. # else
  258. (a, O_1)
  259. CHAR a[];
  260. LONGCARD O_1;
  261. # endif
  262. {
  263.   Strings_tString s;
  264.   OPEN_ARRAY_LOCALS
  265.  
  266.   ALLOC_OPEN_ARRAYS(O_1 * sizeof(CHAR), 1)
  267.   COPY_OPEN_ARRAY(a, O_1, CHAR)
  268.   Strings_ArrayToString(a, O_1, &s);
  269.   Errors_ErrorMessageI((LONGCARD)Errors_eInternal, (LONGCARD)Errors_eFatal, Positions_NoPosition, (LONGCARD)Errors_eString, ADR(s));
  270.   FREE_OPEN_ARRAYS
  271. }
  272.  
  273. void BEGIN_Tokens()
  274. {
  275.   static BOOLEAN has_been_called = FALSE;
  276.  
  277.   if (!has_been_called) {
  278.     has_been_called = TRUE;
  279.  
  280.     BEGIN_Lists();
  281.     BEGIN_TokenTab();
  282.     BEGIN_Idents();
  283.     BEGIN_Lists();
  284.     BEGIN_Strings();
  285.     BEGIN_StringMem();
  286.     BEGIN_TokenTab();
  287.     BEGIN_Memory();
  288.     BEGIN_Idents();
  289.     BEGIN_TokenTab();
  290.     BEGIN_Errors();
  291.     BEGIN_Positions();
  292.  
  293.     StartDecl = NIL;
  294.     WDecl = NIL;
  295.     RDecl = NIL;
  296.     ReadyForReading = FALSE;
  297.     {
  298.       register struct S_2 *W_1 = &TokensVars;
  299.  
  300.       Lists_MakeList(&W_1->GlobalComment);
  301.       W_1->GlobalCommPos.Line = 0;
  302.       W_1->GlobalCommPos.Column = 0;
  303.       Lists_MakeList(&W_1->TOKENComment);
  304.       W_1->TOKENCommPos.Line = 0;
  305.       W_1->TOKENCommPos.Column = 0;
  306.     }
  307.   }
  308. }
  309.